package br.com.tarcilahelpdesk.managedBeans;

import br.com.tarcilahelpdesk.enums.EnumEstadoChamado;
import br.com.tarcilahelpdesk.enums.EnumObjetosPersistentes;
import br.com.tarcilahelpdesk.modelo.Modelo;
import br.com.tarcilahelpdesk.persistencia.Chamado;
import br.com.tarcilahelpdesk.persistencia.Servico;
import br.com.tarcilahelpdesk.persistencia.Solicitante;
import br.com.tarcilahelpdesk.util.HibernateUtil;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.hibernate.Session;
import org.primefaces.event.FlowEvent;

/**
 * MB da janela de abertura de chamados.
 * @author vinicius
 */
@ManagedBean(name = "chamado")
@ViewScoped
public class ChamadoBean implements Serializable
{

    private Solicitante solicitante;
    private Servico servico;
    private String descricao;
    private Session ss;
    private SimpleDateFormat fmtHora = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    private char quebra = (char)13;

    /**
     * Construtor - Abre a sessao do hibernate.
     */
    public ChamadoBean()
    {
        solicitante = new Solicitante();
        servico = new Servico();
        ss = HibernateUtil.getSessionFactory().openSession();
    }

    /**
     * Encerra a sessão do hibernate na destruicao do bean.
     */
    @PreDestroy
    public void encerrar()
    {
        ss.close();
    }

    public void limparBean()
    {
        setDescricao("");
        setServico(new Servico());
        setSolicitante(new Solicitante());
    }

    public String eventoProsseguir(FlowEvent event)
    {

        if (event.getNewStep().equals("tabServico") && getSolicitante().getNome() == null)
        {
            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Cadastre algum solicitante antes de prosseguir!",""));   
            return event.getOldStep();
        }
        else if (event.getNewStep().equals("tabConfirmacao") && getServico().getNome() == null)
        {
            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Cadastre algum serviço antes de prosseguir!",""));   
            return event.getOldStep();
        }
        
        return event.getNewStep();
    }

        public String abrirChamado()
    {

        Chamado chamado = new Chamado();

        chamado.setNomeSolicitante(getSolicitante().getNome());
        //chamado.setAtributosSolicitante(getSolicitante().getAtributosSolicitante());        
        
        chamado.setNomeServico(getServico().getNome());
        chamado.setEstado(EnumEstadoChamado.Aberto);
        chamado.setDataAbertura(new Date(Calendar.getInstance().getTimeInMillis()));
        chamado.setHistorico("Descrição Inicial | " + fmtHora.format(chamado.getDataAbertura())+ " : " 
                + quebra
                + getDescricao());

        Modelo.getInstancia().adicionar(chamado, ss);

        limparBean();               
        
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        session.invalidate();
        
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("numeroChamado", chamado.getId());
        
        return "/sucesso";
    }

    /**
     * Gera a lista de solicitantes para montagem do combo.
     * @return SelectItem de solicitantes,
     */
    public Collection getListaSolicitantes()
    {
        return Modelo.getInstancia().getListaObjetosPersistentes(EnumObjetosPersistentes.Solicitante, ss);
    }

    /**
     * Gera a lista de servicos para montagem do combo.
     * @return SelectItem de servicos,
     */
    public Collection getListaServicos()
    {
        return Modelo.getInstancia().getListaObjetosPersistentes(EnumObjetosPersistentes.Servico, ss);
    }

    public Solicitante getSolicitante()
    {
        return solicitante;
    }

    public void setSolicitante(Solicitante solicitante)
    {
        this.solicitante = solicitante;
    }

    public Servico getServico()
    {
        return servico;
    }

    public void setServico(Servico servico)
    {
        this.servico = servico;
    }

    public String getDescricao()
    {
        return descricao;
    }

    public void setDescricao(String descricao)
    {
        this.descricao = descricao;
    }
}
